package cn.itsource.consumer;

import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.io.IOException;

/**
 * <p>监听邮件队列，消费邮件消息</p>
 *
 * @author 波波老师(微信 ： javabobo0513)
 * @date 2022/11/15-16:21
 */
@Component
@Slf4j
public class EmailConsumer {

    @RabbitListener(queues = {"queue_email"})
    public void emailHandler(String msg, Message message, Channel channel) throws IOException {
        //获取到消息
        log.info("邮件消费者监听到了消息========={}", msg);
        try {
            //业务处理
            //调用第三方网关发送邮件
            //.......

            //手动ACK，一定要写到所有业务代码的最后面，等到所有业务代码执行完毕之后，再手动ACK
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        }catch (Exception e){
            e.printStackTrace();
            /**
             * 第一个参数：交货标签，简单理解为消息在RabbitMQ中存储的唯一标识ID，Long类型的
             * 第二个参数：true表示签收小于等于交货标签数值的所有消息，false标识仅仅签收交货标签值的消息
             * 第三个参数：如果被拒绝的消息应该重新排队而不是丢弃，则为true
             */
            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
        }
    }
}